package com.mtons.mblog.modules.service;

import com.mtons.mblog.base.lang.Consts;
import com.mtons.mblog.modules.data.QuestVO;
import com.mtons.mblog.modules.entity.Channel;
import com.mtons.mblog.modules.entity.Quest;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

@CacheConfig(cacheNames = Consts.CACHE_USER)
public interface QuestService {
    /**
     * 分页查询所有问题
     *
     * @param pageable
     */
    @Cacheable
    Page<QuestVO> paging(Pageable pageable);

    Page<QuestVO> paging4Admin(Pageable pageable, String title);

    /**
     * 查询个人发布问题
     * @param pageable
     * @param userId
     */
    Page<QuestVO> pagingByAuthorId(Pageable pageable, long userId);

    /**
     * 查询最近更新 - 按发布时间排序
     * @param maxResults
     * @return
     */
    @Cacheable(key = "'latest_quests_' + #maxResults")
    List<QuestVO> findLatestQuests(int maxResults);

    /**
     * 查询热门文章 - 按浏览次数排序
     * @param maxResults
     * @return
     */
    @Cacheable(key = "'hottest_quests_' + #maxResults")
    List<QuestVO> findHottestQuests(int maxResults);

    /**
     * 根据Ids查询
     * @param ids
     * @return <id, 问题对象>
     */
    Map<Long, QuestVO> findMapByIds(Set<Long> ids);

    /**
     * 发布问题
     * @param quest
     */
    @CacheEvict(allEntries = true)
    long post(QuestVO quest);

    /**
     * 问题详情
     * @param id
     * @return
     */
    @Cacheable(key = "'post_' + #id")
    QuestVO get(long id);

    /**
     * 更新问题方法
     * @param q
     */
    @CacheEvict(allEntries = true)
    void update(QuestVO q);

    /**
     * 推荐/精华
     * @param id
     * @param featured 0: 取消, 1: 加精
     */
    @CacheEvict(allEntries = true)
    void updateFeatured(long id, int featured);

    /**
     * 置顶
     * @param id
     * @param weighted 0: 取消, 1: 置顶
     */
    @CacheEvict(allEntries = true)
    void updateWeight(long id, int weighted);

    /**
     * 带作者验证的删除 - 验证是否属于自己的问题
     * @param id
     * @param authorId
     */
    @CacheEvict(allEntries = true)
    void delete(long id, long authorId);

    /**
     * 批量删除问题, 且刷新缓存
     *
     * @param ids
     */
    @CacheEvict(allEntries = true)
    void delete(Collection<Long> ids);

    /**
     * 自增浏览数
     * @param id
     */
    @CacheEvict(key = "'view_' + #id")
    void identityViews(long id);

    /**
     * 自增回答数
     * @param id
     */
    @CacheEvict(key = "'view_' + #id")
    void identityAnswers(long id);

    long count();

    List<Quest> findAll(int status);

    Quest getById(long questId);
}
